package edu.uoc.vmerinom.tfc.report;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import net.sf.jooreports.templates.DocumentTemplateException;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

import edu.uoc.vmerinom.tfc.domain.Componente;
import edu.uoc.vmerinom.tfc.domain.Grupo;
import edu.uoc.vmerinom.tfc.support.Message;
import edu.uoc.vmerinom.tfc.support.Utils;

/**
 * Clase que gestiona la generación de informes a través del servidor de
 * LibreOffice para el módulo de grupos.
 * 
 * @author Víctor Manuel Merino Martínez
 * 
 */
@Name("gruposReport")
@Scope(ScopeType.CONVERSATION)
public class GruposReport extends Reports {

	/**
	 * Ruta y nombre de la plantilla.
	 */
	static final String RUTA_PLANTILLA_LISTADO = "/libreoffice/grupos.odt";
	/**
	 * Campo título nombre del grupo.
	 */
	static final String TITULO_NOMBRE = "tituloNombre";
	/**
	 * Campo título estilo del grupo.
	 */
	static final String TITULO_ESTILO = "tituloEstilo";
	/**
	 * Campo título número de componentes.
	 */
	static final String TITULO_COMPONENTES = "tituloComponentes";
	/**
	 * Campo título nombre del representante.
	 */
	static final String TITULO_REPRESENTANTE = "tituloRepresentante";
	/**
	 * Campo nombre del grupo.
	 */
	static final String NOMBRE = "nombre";
	/**
	 * Campo estilo del grupo.
	 */
	static final String ESTILO = "estilo";
	/**
	 * Campo número de componentes en el grupo.
	 */
	static final String COMPONENTES = "componentes";
	/**
	 * Campo nombre del representante del grupo.
	 */
	static final String REPRESENTANTE = "representante";
	/**
	 * Campo que almacena la lista de grupos.
	 */
	static final String GRUPOS = "grupos";
	/**
	 * Lista de grupos.
	 */
	List<Grupo> grupos;

	/**
	 * Genera un listado en PDF del registro actual de grupos.
	 * 
	 * @throws IOException
	 *             Excepciones de entrada/salida
	 * @throws DocumentTemplateException
	 *             Excepciones producidas en la conversión o la sustitución de
	 *             variables.
	 */
	public void listado() throws IOException, DocumentTemplateException {
		Map<String, Object> mapModel = new HashMap<String, Object>();
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		Date date = new Date();
		mapModel.put(FECHA_HORA, sdf.format(date));
		mapModel.put(TITULO_REGISTRO, Message.get("report.bands.list.title"));
		mapModel.put(TITULO_NOMBRE, Message.get("report.bands.name"));
		mapModel.put(TITULO_ESTILO, Message.get("report.bands.style"));
		mapModel.put(TITULO_COMPONENTES, Message.get("report.bands.members"));
		mapModel.put(TITULO_REPRESENTANTE, Message.get("report.bands.representative"));

		Map<String, String> gru = null;
		List<Map<String, String>> grus = new ArrayList<Map<String, String>>();
		for (Grupo grupo : getGrupos()) {
			if (grupo.getBaja() == null || grupo.getBaja().compareTo(date) > 0) {
				gru = new HashMap<String, String>();
				gru.put(NOMBRE, grupo.getNombre());
				String value = "";
				if (grupo.getTendencia() != null) {
					value = grupo.getTendencia();
				}
				gru.put(ESTILO, value);
				value = "0";
				if (grupo.getComponentes() != null && !grupo.getComponentes().isEmpty()) {
					value = Integer.valueOf(grupo.getComponentes().size()).toString();
				}
				gru.put(COMPONENTES, value);
				gru.put(REPRESENTANTE, obtenerRepresentante(grupo));
				grus.add(gru);
			}
		}

		mapModel.put(GRUPOS, grus);

		write(mapModel, "RG", RUTA_PLANTILLA_LISTADO, date);
	}

	/**
	 * Devuelve el nombre del representante del grupo que recibe por parámetros.
	 * 
	 * @param grupo
	 *            Grupo
	 * @return Nombre del representante.
	 */
	private String obtenerRepresentante(Grupo grupo) {
		String representante = "";
		if (grupo.getComponentes() != null) {
			Iterator<Componente> iterator = grupo.getComponentes().iterator();
			while ("".equals(representante) && iterator.hasNext()) {
				Componente componente = iterator.next();
				if (componente.isRepresentante()) {
					representante = Utils.getNombreApellidos(componente.getUsuario().getNombre(), componente.getUsuario().getPrimerApellido(), componente
							.getUsuario().getSegundoApellido());
				}
			}
		}
		return representante;
	}

	public void setGrupos(List<Grupo> grupos) {
		this.grupos = grupos;
	}

	public List<Grupo> getGrupos() {
		return grupos;
	}

}
